/**
* \file		TabTerrains.h
* \brief	Création et gestion du tableau regroupant les différents
*		types de terrain existant
* \details	C'est ici que sont définis les accesseurs et mutateurs du
*		tableau de terrains. Les set ne devraient être utilisés que
*		lors du chargement initial des données du jeu (chargement de
*		partie/nouvelle partie) depuis le fichier DatTerr contenu
*		dans le dossier data.
*/

#ifndef TABTERRAINS_H
#define TABTERRAINS_H
#include "Terrain.h"
#include <stdio.h>

/**
* \brief	Informations concernant le tableau de terrains
* \details	Cette structure contient le tableau des terrains chargés
*		depuis le fichier data correspondant ainsi que sa taille
*		(également indiquée dans le fichier en question)
*/

typedef struct
{
   Terrain *tabTerr;	/*!<Tableau de Terrains : tableau à 1 dimension */
   int nbCases;		/*!<Entier non signé : taille du tableau */
} TabTerrains;

/*============== Gestion de la mémoire / Création du tableau ==============*/
/**
* \brief	Initialise un tableau de Terrains
* \details	Attribue à chaque case d'un tableau de terrains passé en
*		paramètre un terrain initialisé aux valeurs données dans le
*		fichier de données des terrains.
* \param	ptabTerrains	pointeur sur la structure TabTerrains à
*				initialiser
* \param	f		Pointeur sur le fichier à traiter (fichier
*				déjà ouvert en lecture)
*/
void initTabTerrains(TabTerrains *ptabTerrains, FILE *f);

/**
* \brief	Crée un tableau de Terrains initialisé et rempli
* \details	Alloue de la mémoire à un tableau de Terrain tout neuf, le
*		nombre de cases à réserver ayant été déterminé en lisant le
*		fichier de données correspondant qui aura été passé en
*		paramètre.
* \param	fichierData	Chaîne de caractères, nom du fichier
*				contenant les données. A noter que ce fichier
*				doit obligatoirement se trouver dans le
*				répertoire data.
*/
TabTerrains creerTabTerrains(char *fichierData);


/**
* \brief	Détruit un tableau de Terrains
* \details	Désalloue la mémoire réservée pour le tableau de Terrains
*		passé en paramètre et fait pointer le pointeur sur NULL.
* \param	ptabTerrains	pointeur sur TabTerrains à détruire
*/
void detruireTabTerrains(TabTerrains *ptabTerrains);

/*============================= Accesseurs =============================*/
/**
* \brief	Retourne le nombre de Cases du tableau de Terrains
* \param	ptabTerrains	Pointeur sur TabTerrains
* \return	Un entier
*/
int getNbCasesTabTerrains(const TabTerrains *ptabTerrains);

/**
* \brief	Retourne le nombre de Cases du tableau de Terrains
* \param	ptabTerrains	Pointeur sur TabTerrains
* \param	indiceCase	Entier, indice de la Case désirée
* \return	L'adresse d'un Terrain
*/
Terrain *getTerrainTabTerrains(const TabTerrains *ptabTerrains, int indiceCase);

/*============================= Mutateurs =============================*/
/**
* \brief	Retourne le nombre de Cases du tableau de Terrains
* \param	ptabTerrains	Pointeur sur TabTerrains
* \param	nouvNbCases	Entier, nombre de Cases
*/
void setNbCasesTabTerrains(TabTerrains *ptabTerrains, int nouvNbCases);

/*=============================== Autres ===============================*/
/**
* \brief	Recherche un Terrain dans un tableau de Terrains
* \details	Recherche dans un tableau de Terrains donné un Terrain dont
*		le nom aura été passé en paramètre pour le retourner.
* \param	ptabTerrains	pointeur sur TabTerrains
* \param	nomTerr		Chaîne de caractères contenant le nom du
*				Terrain recherché
* \return	Le Terrain recherché
*/
Terrain *rechercheTabTerrains(const TabTerrains *ptabTerrains, const char *nomTerr);

/*=========================== Fonctions de Test ===========================*/
/**
* \brief	Teste les différentes fonctions du module TabTerrrains
*/
void testTabTerrains();

#endif
